package dao;

import entity.Item;  // 导入商品信息的模板属性
import util.DatabaseUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ItemDAOImpl implements ItemDAO {

    /**
     * 添加新商品（用户发布商品时调用）
     */
    @Override
    public boolean addItem(Item item) {
        // 往items表插数据，?是占位符，后面会换成具体商品信息（防止输入错误搞乱数据库）
        String sql = "INSERT INTO items (user_id, name, price, category, description, usage_months, item_condition) VALUES (?, ?, ?, ?, ?, ?, ?)";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, item.getUserId());  // 第一个?填发布者的用户ID
            pstmt.setString(2, item.getName());  // 第二个?填商品名称
            pstmt.setDouble(3, item.getPrice());  // 第三个?填商品价格
            pstmt.setString(4, item.getCategory());  // 第四个?填商品分类（比如"数码"）
            pstmt.setString(5, item.getDescription());  // 第五个?填商品描述
            pstmt.setInt(6, item.getUsageMonths());  // 第六个?填使用了几个月
            pstmt.setString(7, item.getCondition());  // 第七个?填商品新旧程度（比如"良好"）

            // 执行插入，返回受影响的行
            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;  // 有行数受影响就是成功了

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除商品（根据商品ID删）
     */
    @Override
    public boolean deleteItem(int itemId) {
        //删除items表里指定ID的商品
        String sql = "DELETE FROM items WHERE item_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, itemId);  //填要删的商品ID
            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 更新商品信息（比如改价格、改描述）
     */
    @Override
    public boolean updateItem(Item item) {
        // 根据商品ID更新信息，改名称、价格、状态这些
        String sql = "UPDATE items SET name = ?, price = ?, category = ?, description = ?, usage_months = ?, item_condition = ?, status = ? WHERE item_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 前面是要改的新信息，最后一个是商品ID（确定改哪个商品）
            pstmt.setString(1, item.getName());
            pstmt.setDouble(2, item.getPrice());
            pstmt.setString(3, item.getCategory());
            pstmt.setString(4, item.getDescription());
            pstmt.setInt(5, item.getUsageMonths());
            pstmt.setString(6, item.getCondition());
            pstmt.setString(7, item.getStatus());  // 商品状态（在售/已售/下架）
            pstmt.setInt(8, item.getItemId());

            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据商品ID查商品
     */
    @Override
    public Item getItemById(int itemId) {
        // 查items表里指定ID的商品
        String sql = "SELECT * FROM items WHERE item_id = ?";
        Item item = null;  // 先初始化一个空商品

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, itemId);  // 填要查的商品ID
            // 得到结果
            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                // 调用下面的extractItemFromResultSet方法，把结果集转成Item对象
                item = extractItemFromResultSet(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return item;
    }

    /**
     * 获取所有在售
     */
    @Override
    public List<Item> getAllItems() {
        List<Item> items = new ArrayList<>();  // 准备个容器装商品
        // 只查status是"在售"的商品
        String sql = "SELECT * FROM items WHERE status = '在售'";

        try (Connection conn = DatabaseUtil.getConnection();
             // 简单的Statement就行，因为没有参数
             // 还是不知道
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            while (rs.next()) {
                // 转成Item对象
                items.add(extractItemFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return items;
    }

    /**
     * 按分类查商品
     */
    @Override
    public List<Item> getItemsByCategory(String category) {
        List<Item> items = new ArrayList<>();
        // 查指定分类且状态是"在售"的商品
        String sql = "SELECT * FROM items WHERE category = ? AND status = '在售'";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, category);  // 填要查的分类
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                items.add(extractItemFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return items;
    }

    /**
     * 查指定用户发布的所有商品
     */
    @Override
    public List<Item> getItemsByUserId(int userId) {
        List<Item> items = new ArrayList<>();
        // 查指定用户发布的所有商品
        String sql = "SELECT * FROM items WHERE user_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, userId);  // 填用户ID
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                items.add(extractItemFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return items;
    }

    /**
     * 搜索商品
     */
    @Override
    public List<Item> searchItems(String keyword) {
        List<Item> items = new ArrayList<>();
        // 查名字或描述包含关键词，且状态是"在售"
        String sql = "SELECT * FROM items WHERE (name LIKE ? OR description LIKE ?) AND status = '在售'";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 给两个?都填 "%关键词%"，比如搜"手机"就变成"%手机%"，这样能匹配包含"手机"的内容
            pstmt.setString(1, "%" + keyword + "%");
            pstmt.setString(2, "%" + keyword + "%");
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                items.add(extractItemFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return items;
    }

    /**
     * 更新商品状态（比如商品卖出后，把状态从"在售"改成"已售"）
     */
    @Override
    public boolean updateItemStatus(int itemId, String status) {
        // 根据商品ID改状态
        String sql = "UPDATE items SET status = ? WHERE item_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, status);  // 填新状态
            pstmt.setInt(2, itemId);  // 填商品ID
            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 把数据库查出来的结果集转换成Item对象 封装的嘞
     */
    private Item extractItemFromResultSet(ResultSet rs) throws SQLException {
        Item item = new Item();  // 新建一个商品对象
        // 把结果里的每一列数据，对应塞进商品对象的属性里
        item.setItemId(rs.getInt("item_id"));  // 商品ID
        item.setUserId(rs.getInt("user_id"));  // 发布者ID
        item.setName(rs.getString("name"));  // 商品名称
        item.setPrice(rs.getDouble("price"));  // 价格
        item.setCategory(rs.getString("category"));  // 分类
        item.setDescription(rs.getString("description"));  // 描述
        item.setUsageMonths(rs.getInt("usage_months"));  // 使用月数
        item.setCondition(rs.getString("item_condition"));  // 新旧程度
        item.setPublishDate(rs.getTimestamp("publish_date"));  // 发布时间
        item.setStatus(rs.getString("status"));  // 状态（在售/已售/下架）
        return item;
    }
}